//  1.编写一个方法，该方法接收两个参数，分别为k和一个无序的纯数字数组。该方法在执行后，会返回数组中第k大的数字。特别注意，
//  如果数组中，有两位数值一样的数字，同数值数字排名并列。如[3,1,3,2,5,4,5]中，第1大的是5，第2大的是4，第5大的是数字为1

function search(k, numberArr) {
  // // 首先降序排列
  // const sortArr = numberArr.sort((a, b) => b - a);
  // let result; // 记录最终结果
  // let count = 1; // 用来记录当前循环为第几大
  // for (let i = 0; i < sortArr.length; i++) {
  //   if ((k || 1) === count) {
  //     result = sortArr[i];
  //     break;
  //   } else if (sortArr[i] < sortArr[i - 1]) {
  //     count++;
  //     if (count === k) {
  //       result = sortArr[i];
  //       break;
  //     }
  //   }
  // }
  // return result || sortArr[sortArr.length - 1];

  let result;
  const sortArr = [...new Set(numberArr.sort((a, b) => b - a))];
  const len = sortArr.length;
  if (k && k < len) {
    result = sortArr[k - 1];
  } else if (k && k > len) {
    result = sortArr[sortArr.length - 1];
  } else {
    result = sortArr[0];
  }
  return result;
}

var res = search(1, [1, 2, 3, 4, 5, 6]);
console.log(
  "%c 🌮 res: ",
  "font-size:20px;background-color: #2EAFB0;color:#fff;",
  res
);

// 2.__proto__和prototype之间有什么关系

// 实例的__proto__指向构造函数的prototype属性
// 构造函数的prototype的constructor属性指向构造函数本身

// 3.call(),apply(),bind()的区别和作用，bind方法如何来实现

// 这三个方法都是改变方法的执行上下文（this）

// call 和 apply 方法接收的第一参数都为该调用方法的上下文。都是为了改变调用方法的this指向，并执行该方法且返回最终结果。
// 区别在于 call 方法内第一个参数之后的参数为该调用方法的参数。而 apply 方法第二个参数接收一个数组，该数组内的值为该调用方法的参数

// bind 方法改变方法的执行上下文并返回新的方法，并不执行

function test() {
  console.log(this.b);
}

var a = {
  a: 1,
  b: 2,
};

// var bindFn = test.bind(a);
// bindFn();

Function.prototype.myBind = function (context) {
  const args = Array.prototype.splice(arguments, 1);
  const selfFn = this;
  const result = function () {
    selfFn.apply(context, args);
  };

  return result;
};

var myBindFn = test.myBind(a);
myBindFn();
